package com.qianfeng.netty.http;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import com.qianfeng.netty.anno.Controller;
import com.qianfeng.netty.anno.RequestMapping;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Jackiechan on 2022/2/18/11:23
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class TestMain {
    public static Map<String, Method> allMapping = new HashMap<>();
    public static Map<String, Object> allControllers = new HashMap<>();
    public static void jiexi() {
        new Thread(){
            @Override
            public void run() {
                //解析controller
                Package package1 = getClass().getPackage();
               // System.err.println(package1);
                String path = package1.getName().replace(".", "\\");
             //   System.err.println(path);
                try {
                    Enumeration<URL> enumeration = TestMain.class.getClassLoader().getResources(".");
                    while (enumeration.hasMoreElements()) {
                        URL url = enumeration.nextElement();
                      //  System.err.println(url);
                        if (url.getProtocol().startsWith("file")) {
                            String jueduilujing = url.toString().replace("file:/", "");
                            File file = new File(jueduilujing + path);
                            File[] files = file.listFiles();
                            for (File file1 : files) {
                               // System.err.println(file1.getName());
                                //System.err.println(file1.getAbsolutePath());
//                                String className = file1.getAbsolutePath()
//                                        .replace(jueduilujing, "").replace(".class", "")
//                                        .replace("\\", ".");
                                String absolutePath = file1.getAbsolutePath();//获取每个文件的绝对路径.包含.class
                                absolutePath=absolutePath.replace(".class","");//去掉最后面的.class
                                String simpleClassName = absolutePath.substring(absolutePath.lastIndexOf(File.separator)+1);//只要类的最后的名字,包名前面有
                               // System.err.println(SimpleClassName);
                                String className = package1.getName() + "." + simpleClassName;//重新通过包名和类名来拼接全限定名称
                                System.err.println(className);
                                Class<?> aClass = Class.forName(className);//通过全限定名称反射加载这个类
                                Controller controller = aClass.getAnnotation(Controller.class);//看看类上面有没有这个注解
                                if (controller != null) {//如果有这个注解
                                    Object controllerObj = aClass.newInstance();//创建我们的后面执行方法的对象

                                    String baseRequestPath = "";//基础路径,就是类上面的那个路径,但是可以不写,所以默认是""
                                    RequestMapping mapping = aClass.getAnnotation(RequestMapping.class);//获取类上面有没有这个请求映射的注解
                                    if (mapping != null) {
                                        baseRequestPath = mapping.value();//有就获取里面的路径,并设置前缀的地址
                                    }
                                    //遍历方法
                                    Method[] methods = aClass.getMethods();//获取到这个类中的所有的方法
                                    for (Method method : methods) {
                                        RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);//看看每个方法上面有没有RequestMapping
                                        if (requestMapping == null) {
                                            continue;
                                        }
                                        String methodPath = requestMapping.value();//获取到里面的地址
                                        String zuizhong = baseRequestPath + methodPath;//最终的请求路径就是类上面地址的加上方法上面的地址
                                        System.err.println(zuizhong);
                                        allMapping.put(zuizhong, method);//保存到映射的map,方法和路径有映射关系了
                                        allControllers.put(zuizhong, controllerObj);//地址和controller类之间的关系也有了
                                    }
                                }
                            }
                        }
                    }
                } catch ( Exception e) {
                    e.printStackTrace();
                }

                //  File file = new File(path);
              //  File[] files = file.listFiles();
                //System.err.println(files);
                System.err.println(allMapping);
            }
        }.start();

    }
}
